*&---------------------------------------------------------------------*
*& Report ZEX_LISTING_45                                               *
*&---------------------------------------------------------------------*
*& Created By: James Wood (james.wood@bowdarkconsulting.com)           *
*& Created On: 12/12/2008                                              *
*& Purpose:    This program demonstrates the use of class constructors *
*&             for initializing class attributes.                      *
*&---------------------------------------------------------------------*
REPORT zex_listing_45.

*----------------------------------------------------------------------*
*       CLASS lcl_counter DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_counter DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS: class_constructor.

    METHODS: increment,
             get_count RETURNING value(re_count)
                            TYPE i.

  PRIVATE SECTION.
    CLASS-DATA: count TYPE i.

ENDCLASS.                    "lcl_counter DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_counter IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_counter IMPLEMENTATION.
  METHOD class_constructor.
    count = 10.
  ENDMETHOD.                    "class_constructor

  METHOD increment.
    count = count + 5.
  ENDMETHOD.                    "increment

  METHOD get_count.
    re_count = count.
  ENDMETHOD.                    "get_count
ENDCLASS.                    "lcl_counter IMPLEMENTATION

*----------------------------------------------------------------------*
* START-OF-SELECTION Event Module                                      *
*----------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM test_counter.

*&---------------------------------------------------------------------*
*&      Form  test_counter
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM test_counter.

* Local Data Declarations:
  DATA: lr_counter1 TYPE REF TO lcl_counter,
        lr_counter2 TYPE REF TO lcl_counter,
        lv_count    TYPE i.

* Create a counter and output it's current count:
  CREATE OBJECT lr_counter1.
  lv_count = lr_counter1->get_count( ).
  WRITE: / 'Count is:', lv_count.

* Increment the counter 10 times:
  DO 10 TIMES.
    lr_counter1->increment( ).
  ENDDO.

* Output the revised count:
  lv_count = lr_counter1->get_count( ).
  WRITE: / 'Count is:', lv_count.

* Verify that the count remains in context for another counter object:
  CREATE OBJECT lr_counter2.
  lr_counter2->increment( ).
  lv_count = lr_counter2->get_count( ).
  WRITE: / 'Count is:', lv_count.

ENDFORM.                    "test_counter